[SQL] 집계함수, 스칼라함수

  1. 집계함수
  2. 스칼라 함수

집계함수

  • 집계함수는 한번에 모아서 처리하는 (집계) 역할이기에, 다른 column(열)과 함께 조회하려면 GROUP BY 절을 이용
  • 왜 GROUP BY가 필요한가: 집계함수는 여러 행을 하나의 값으로 압축(reduce)하는 연산이다. 예를 들어 COUNT(*)은 전체를 하나의 숫자로 뭉치는데, 여기에 GROUP BY 열을 더하면 “전체를 하나로” 대신 “열 값이 같은 행끼리 묶어서 각각 하나로” 압축하는 방식으로 바뀐다. GROUP BY 없이 집계함수와 일반 열을 같이 SELECT하면, 그 일반 열은 그룹(또는 전체) 안에서 값이 여러 개 섞여 있을 수 있어 DB가 대표값 하나를 결정할 근거가 없다.
함수설명사용법
Count레코드의 개수를 반환SELECT COUNT(*) from [테이블명] GROUP BY [다른 column(열)];
Sum특정 열의 합계 계산SELECT SUM(num) FROM [테이블명] GROUP BY [다른 column(열)];
Avg특정 열의 평균값SELECT AVG(num) FROM [테이블명] GROUP BY [다른 column(열)];
Max특정 열의 최대 값SELECT MAX(num) FROM [테이블명] GROUP BY [다른 column(열)];
Min특정 열의 최소 값SELECT Min(num) FROM [테이블명] GROUP BY [다른 column(열)];

스칼라 함수

  • 스칼라함수는 행마다 결과를 반환
  • 왜 집계함수와 구분하는가: 집계함수가 “여러 행 → 값 하나”로 압축하는 것과 반대로, 스칼라 함수는 “행 하나 → 값 하나”를 반환해 입력 행 수와 출력 행 수가 항상 같다. 그래서 스칼라 함수는 GROUP BY 없이 일반 컬럼과 자유롭게 함께 SELECT할 수 있다.
    1. 문자열함수

DB 엔진

LENDATEADD는 SQL Server(T-SQL) 전용 함수명이다. MySQL은 각각 LENGTH(또는 멀티바이트 문자 수 기준 CHAR_LENGTH)와 DATE_ADD를 쓰고, Oracle은 LENGTH날짜 + INTERVAL '7' DAY 또는 날짜 + 7(일 단위 덧셈) 형태를 쓴다. 이 노트의 함수명은 DB마다 혼용되어 있으니, 실제 사용하는 DB 문서를 기준으로 확인이 필요하다.

함수설명사용법
Concat여러 문자열을 연결Select CONCAT( first, ’ ’, last ) AS first_value from [테이블명];
Len, Length문자열 길이 반환Select LEN(name) FROM [ 테이블명];
Upper문자열을 대문자로 변환Select Upper(username) From [테이블명];
Lower문자열을 소문자로 변환Select Lower(username) From [테이블명];
Substring, substr문자열의 일부 반환substr(‘열’, 위치, 반환개수)Select Substr(username,2,2) From [테이블명];
Replace문자열 대체replace(‘열’, ‘바뀔문자’, ‘변경후문자’)Select Replace(username, ‘test’, ‘sql’) from [테이블명];
    1. 수치함수
함수설명사용법
Round숫자 반올림round(‘열’, 소수점 반올림위치)Select Round(num, 2) From [테이블명];
Ceil숫자 올림Select CEIL(5.2);
Floor숫자 내림Select FLOOR(5.8);
Abs숫자 절대값Select ABS(-10);
    1. 날짜함수
함수설명사용법
Now현재 날짜와 시간을 반환SELECT NOW();
Curdate현재 날짜 반환Select CURDATE();
Dateadd날짜에 특정기간 더함SELECT DATEADD(DAY, 7, ‘2024-10-10);
Datediff두 날짜 차이 반환Select DATEDIFF(‘2024-10-10’, ‘2024-11-01’);
Date_Format날짜 형식 지정Select DATE_FORMAT(Now(), ‘%y-%m-%d’);
    1. 조건함수
함수설명사용법
IF조건에 따라 다른값 반환Select If(age >20, ‘adult’, ‘child’) From [테이블명];
CASE조건에 따라 여러값 반환SELECT CASE WHEN age>60 THEN ‘senior’ WHEN age Between 20 AND 60 THEN ‘adult’ ELSE ‘child’END AS age_typeFrom [테이블명];